﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Com.Allscore
{
    /// <summary>
    /// 类名：MD5Util
    /// 功能：MD5解密、签名、验签
    /// 详细：该类对Java生成的密钥进行解密和签名以及验签专用类，不需要修改
    /// 版本：3.0
    /// 日期：2011-09-01
    /// 说明：
    /// 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
    /// 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
    /// </summary>
    public class MD5Util
    {
        public MD5Util()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }
        /// <summary>
        /// 签名
        /// </summary>
        /// <param name="content">待签名字符串</param>
        /// <param name="privateKey">私钥</param>
        /// <param name="input_charset">编码格式</param>
        /// <returns>签名后字符串</returns>
        public static string sign(string content, string Key, string input_charset)
        {

            string text = content + Key;

            //将要加密的字符串转化为byte类型
            byte[] data = System.Text.Encoding.UTF8.GetBytes(text.ToArray());
            //创建一个Md5对象
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            //加密Byte[]数组
            byte[] result = md5.ComputeHash(data);
            
            //将加密后的数组转化为字段
            string sResult = System.Text.Encoding.Unicode.GetString(result);


            return new String(encodeHex(result));
        }


        /// <summary> 
        /// 字节数组转16进制字符串 
        /// </summary> 
        /// <param name="bytes"></param> 
        /// <returns></returns> 
        public static string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                }
            }
            return returnStr;
        } 

          /**
         * Used building output as Hex
         */
        private static char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6',
                                         '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

        public static char[] encodeHex(byte[] data)
        {

            int l = data.Length;

            char[] outc = new char[l << 1];

            // two characters form the hex value.
            for (int i = 0, j = 0; i < l; i++)
            {
                outc[j++] = DIGITS[(0xF0 & data[i]) >> 4];
                outc[j++] = DIGITS[0x0F & data[i]];
            }

            return outc;
        }

    }
}